#ifndef _MY_LOG_
#define _MY_LOG_

typedef unsigned char u_char;
#define LOG_SIZE  2048
#define LOG_PATH "./error.log" 
#include <unistd.h>
#include <map>  //采用map,作为待写日志的容器，key:日志优先级
#include <semaphore.h>  //采用信号量
#include <pthread.h>
#define STOP_THREAD 0
#define RUNNING_THREAD 1
class my_log{

public:
    
    
    
    //对外的全局访问点
    static my_log *get_log_instance(){
        if(log==nullptr){
            log=new my_log();
            static for_my_log ll;   //单纯为了保证log的生命周期
        }
        return log;
    }
    //写日志接口
    void write_log(int level,int err, const char *fmt,...);
    ~my_log();
private:
    int fd; //日志文件描述符
    int log_level; //需要记录日志的等级  ----越低，越重要
    static my_log * log;
    std::multimap<int,char *> wait_to_write_log; //存放日志信息
    int is_running; //写日志线程是否启动

    //sem_t sem_for_wake_write_thread;    // 唤醒信号量   //这里还是不要用信号量了，用条件变量吧
    pthread_mutex_t mutex;  //需要加锁互斥了
    pthread_cond_t cond_t;  //采用条件变量吧

    my_log();   //进行初始化   如打开某个文件，方便后续进行写操作
    my_log(const my_log & log)=delete;  // 禁用拷贝构造
    my_log & operator=(const my_log &log)=delete;   //禁用=赋值

    void  get_err_info(char *p,int err);

    pthread_t handler;
    int stop_flag;  //是否结束的标志
    static void * doing_write_log_thread(void *this_log);   //需要把当前 
    class for_my_log{
        public:

        ~for_my_log(){
            if(log){
                
                delete log;
                log=nullptr;

            }
        }
    };
};




#endif